<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型对象</title>
</head>
<body>
    
</body>
</html>
<script>
    //使用原型对象的concat方法完成连接操作
    // let hd = ["a"];
    // console.log(hd.concat("b"));
    // console.log(hd)

    // let hd = {name:"后盾人"};
    // console.log(hd);

    //js的根对象
    // let x = {};
    // let y = {};
    // //所有对象的原型都为 Object 也就是js中的根对象
    // console.log(Object.getPrototypeOf(y) == Object.getPrototypeOf(x))
    
    //我们可以创建一个极简对象（纯数据字典对象）没有原型 原型为null
    // let hd = {name : 3};
    // console.log(hd.hasOwnProperty("name"));

    //创建一个极简对象
    // let xj = Object.create(null,{
    //     name : {
    //         value : "向军"
    //     }
    // });

    // console.log(xj);
    //因为没有原型  所以不存在hasOwnProperty的方法
    // console.log(xj.hasOwnProperty('name'));

    //Object.keys是静态方法,不是原型方法所以是可以使用的
    // console.log(Object.keys(xj));

    // function User(){}
    // //函数是拥有多个原型的   property用于实例化对象使用  
    // //下面相当于给函数增加原型方法
    // User.__proto__.view = function(){
    //     console.log("User function view method");
    // }
    // // let user = new User();
    // // console.log(user)
    // // User.view();


    // User.prototype.show = function(){
    //     console.log("后盾人")
    // };

    // let hd = new User();
    // console.log(hd)
    // hd.show();
    // console.log(User.prototype == hd.__proto__);



    // let hd = new Object();
    // hd.name = '后盾人';

    // //所有对象的最顶端的对象是 Object  给Object原型添加方法    所有的子对象都能使用
    // //自己有的用自己的  自己没有的  父亲有的   也可以使用父亲的
    // Object.prototype.show = function(){
    //     console.log("houdunren.com");
    // }
    // // console.log(hd)
    // hd.show();

    // function User(){}
    // let xj = new User();
    // xj.show()

    // function User(){}

    // let xj = new User();

    // console.log(xj.__proto__ == User.prototype);
    // console.dir(User)

    // let hd = [];
    // console.log(hd);
    // console.log(hd.__proto__ == Array.prototype);

    // let str = "";
    // console.log(str.__proto__ == String.prototype);



    //使用setPrototypeof 与 getPrototypeOf   获取和设置原型
    // let hd = {name : 'hd'};
    // let parent = {name : 'parent'};
    // // console.log(parent);

    // //给hd对象设置原型为parent
    // Object.setPrototypeOf(hd,parent);
    // // console.log(hd)
    // //获取原型
    // console.log(Object.getPrototypeOf(hd));


    // function User(){

    // }
    // let hd = new User();
    // console.log(hd);


    //construct存在于prototype原型中，用于指向构造函数的引用
    // function hd(){
    //     this.show = function(){
    //         return "show method";
    //     }
    // }

    // const obj = new hd();
    // // console.log(obj instanceof hd)

    // const obj2 = new obj.constructor();
    // console.log(obj2.show())


    //使用对象的constructor创建对象
    function User(name,age){
        this.name = name;
        this.age = age;
    }

    

    //使用当前对象创建一个新的对象
    function createByObject(obj,...args){
        //获取对象所属的原型对象的里面的构造方法
        const constructor = Object.getPrototypeOf(obj).constructor;
        return new constructor(...args);
    }

    let hd = new User("后盾人",22);
    let xj = createByObject(hd,"刘皓",'LH_PHP');
    // console.log(hd.__proto__.constructor);
    console.log(xj)









</script>